/**
 * @file    test.c
 * @brief   用语音等方式对各传感器模块进行测试
 *
 * @version 2024-08-15, V1.0, yanf, 厦门芯力量
 */

#pragma diag_suppress 161 // 阻止编译器显示 "Warning:  #161-D: unrecognized #pragma" 警告，因为在 vscode 中使用了 #pragma region 来折叠代码

#include "test.h"
#include "stm32f1xx_hal.h"
#include "stdio.h"
#include "OLED.h"
#include "OLED_Data.h"
#include "stm32f1xx_it.h"
#include "main.h"
#include "su03t.h"

/**
 * @brief   给智能语音模块发送指令
 *
 * @param   code: 在智能语音模块(su-03t)中定义好的指令码
 */
void test_ai_send(uint8_t code)
{
    uint8_t data[] = {0xAA, 0x55, code, 0x55, 0xAA};

    su03t_send_bytes(data, 5);
}

/**
 * @brief   给智能语音模块发送带参数的指令
 *
 * @param   code: 在智能语音模块(su-03t)中定义好的指令码
 * @param   arg1: 参数值，在智能语音固件中会解析此参数
 */
void test_ai_send_arg(uint8_t code, int arg1)
{
    uint8_t data[9] = {0};

    data[0] = 0xAA;
    data[1] = 0x55;
    data[2] = code;
    data[3] = arg1 & 0xFF;
    data[4] = (arg1 >> 8) & 0xFF;
    data[5] = (arg1 >> 16) & 0xFF;
    data[6] = (arg1 >> 24) & 0xFF;
    data[7] = 0x55;
    data[8] = 0xAA;

    su03t_send_bytes(data, 9);
}

/**
 * @brief   给智能语音模块发送带两个参数的指令
 *
 * @param   code: 在智能语音模块(su-03t)中定义好的指令码
 * @param   arg1: 第一个参数值
 * @param   arg2: 第二个参数值
 */
void test_ai_send_arg2(uint8_t code, int arg1, int arg2)
{
    uint8_t data[13] = {0};

    data[0] = 0xAA;
    data[1] = 0x55;
    data[2] = code;
    data[3] = arg1 & 0xFF;
    data[4] = (arg1 >> 8) & 0xFF;
    data[5] = (arg1 >> 16) & 0xFF;
    data[6] = (arg1 >> 24) & 0xFF;
    data[7] = arg2 & 0xFF;
    data[8] = (arg2 >> 8) & 0xFF;
    data[9] = (arg2 >> 16) & 0xFF;
    data[10] = (arg2 >> 24) & 0xFF;
    data[11] = 0x55;
    data[12] = 0xAA;

    su03t_send_bytes(data, 13);
}

/**
 * @brief   语言模块动作预设
 */
void Stand_S()
{
}

/**
 * @brief   模块测试的入口，测试单个传感器模块
 *
 * @param   code: 在智能语音固件中定义的指令码
 */
void test_one(uint8_t code)
{
    switch (code)
    {
    case 0x10:
        test_dwin(code);
        break;
    }
}

/**
 * @brief   接收智能语音模块(su-03t)发送来的数据
 *
 * @param   recv: 数据
 * @param    len: 数据长度
 */
void test_ai_callback(uint8_t *recv, uint8_t len)
{
    // printf("\r\n==>  ");
    // for (uint8_t i = 0; i < len; i++) {
    //     printf("%x ", recv[i]);
    // }
    // printf("\r\n");

    if (recv[2] == 0xEE)
    {
        if (recv[3] == 0xEE)
        { // 握手
            printf("正在准备模块自检\r\n");
            delay_1ms(2000);
            test_ai_send(0x01);
            printf("现在我已为模块自检做好准备，请在确认已接好屏幕和所有传感器模块后，跟我说确认自检吧。\r\n");
        }
        else if (recv[3] == 0xE0)
        { // 全部测试
            printf("模块自检即将开始，我会从电源接口位置开始，按顺时针方向逐个测试。\r\n");
            delay_1ms(8000);
            test_all();
        }
        else
        { // 单项测试
            test_one(recv[3]);
        }

        su03t_receive_clear();
    }
}
